package com.lxl.model;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * 用户
 * 
 * @author 刘星鹭
 * @Email liuxinglumail@163.com
 * @version 创建时间： 2014年8月31日 下午6:35:16
 */
@Entity
@Table(name = "t_users")
public class User {
    private String userName; // 用户名
    private String userPassword; // 用户密码
    private String userSex; // 用户性别
    private java.util.Date userBirthday; // 用户生日
    private Set<Tieba> favourateTiebas = new HashSet<Tieba>(); // 用户喜欢的贴吧

    /**
     * 无参构造方法
     */
    public User() {
        super();
    }

    /**
     * 带参构造方法
     * 
     * @param userName
     *            用户名
     * @param userPassword
     *            用户密码
     * @param userSex
     *            用户性别
     * @param userBirthday
     *            用户生日
     */
    public User(String userName, String userPassword, String userSex,
            Date userBirthday) {
        super();
        this.userName = userName;
        this.userPassword = userPassword;
        this.userSex = userSex;
        this.userBirthday = (Date) userBirthday.clone();
    }

    /**
     * 获得用户名
     * 
     * @return 用户名
     */
    @Id
    // 主键
    @Column(name = "user_name", length = 20, nullable = false)
    // 字段长度为20，不可为空
    public String getUserName() { // 以下均为Getter和Setter
        return userName;
    }

    /**
     * 设置用户名
     * 
     * @param userName
     *            用户名
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * 获得用户密码
     * 
     * @return 用户密码
     */
    @Column(name = "user_password", length = 20, nullable = false)
    // 字段长度为20，不可为空
    public String getUserPassword() {
        return userPassword;
    }

    /**
     * 设置用户密码
     * 
     * @param userPassword
     *            用户密码
     */
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    /**
     * 获得用户性别
     * 
     * @return 用户性别
     */
    @Column(name = "user_sex", length = 5, nullable = false)
    // 字段长度为20，不可为空
    public String getUserSex() {
        return userSex;
    }

    /**
     * 设置用户性别
     * 
     * @param userSex
     *            用户性别
     */
    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    /**
     * 获得用户生日
     * 
     * @return 用户生日
     */
    @Temporal(TemporalType.DATE)
    // 日期类型为DATE
    @Column(name = "user_birthday", nullable = false)
    // 字段不可为空
    public Date getUserBirthday() {
        return (Date) userBirthday.clone();
    }

    /**
     * 设置用户生日
     * 
     * @param userBirthday
     *            用户生日
     */
    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = (Date) userBirthday.clone();
    }

    /**
     * 获得该用户关注的贴吧
     * 
     * @return 该用户关注的贴吧
     */
    @ManyToMany(cascade = {CascadeType.REFRESH, CascadeType.MERGE})
    @JoinTable(name = "t_user_tieba", inverseJoinColumns = @JoinColumn(name = "tieba_name") // 可以理解为“跟被维护端的外键的定义”
    , joinColumns = @JoinColumn(name = "user_name"))
    // 注意这个name是没有提示的
    public Set<Tieba> getFavourateTiebas() {
        return favourateTiebas;
    }

    /**
     * 设置该用户关注的贴吧
     * 
     * @param favourateTiebas
     *            该用户关注的贴吧
     */
    public void setFavourateTiebas(Set<Tieba> favourateTiebas) {
        this.favourateTiebas = favourateTiebas;
    }

    // 重写hashcode和equals方法，因为对象是否相等是用userName判断的，生成方法是alt+shift+s生成hashcode()和equals()
    /**
     * hashCode方法
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((userName == null) ? 0 : userName.hashCode());
        return result;
    }

    /**
     * equals方法
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        } else if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        User other = (User) obj;
        if (userName == null || !userName.equals(other.userName)
                && other.userName != null) {
            return false;
        }
        return true;
    }
}
